/*****************************************Copyright(C)******************************************
****************************************** *********************************************
*------------------------------------------文件信息---------------------------------------------
* FileName          : user_protocol.c
* Author            : 张婷颖
* Version           : 1.0V
* Description       : 
*----------------------------------------历史版本信息-------------------------------------------
* History           :
* Description       :
*-----------------------------------------------------------------------------------------------
***********************************************************************************************/
/* Includes-----------------------------------------------------------------------------------*/
#include "user_protocol.h"
#include "top_scheme.h"
#include "bsp_uart.h"
#include "stdlib.h"
#include "stdio.h"
/* Private define-----------------------------------------------------------------------------*/

/* Private typedef----------------------------------------------------------------------------*/

/* Private macro------------------------------------------------------------------------------*/

/* Private variables--------------------------------------------------------------------------*/
#if RS232
_FRAME_INFO recvinfo_232;               //接收到232的信息帧
#endif
#if RS485_DB9
_FRAME_INFO recvinfo_485;               //接收到485的信息帧
#endif
#if MODBUS_485
_FRAME_INFO recv_modbus485;             //接收到485_modbus的信息帧
#endif
#if MQTT_NB_IOT
_FRAME_INFO recv_mqtt_nb;               //接收到nb_mqtt的信息帧
#endif/*MQTT_NB_IOT*/
#if MQTT_4G_CAT1
_FRAME_INFO recv_mqtt_4g;               //接收到nb_mqtt的信息帧
#endif /*MQTT_4G_CAT1*/

_TX_DATA_INFO tx_data;                  //应答数据域


uint8_t count_rx = 0;                              //记录收了几个协议的信息
uint8_t count = 0;                                 //记录有几个协议
/* Private function prototypes----------------------------------------------------------------*/

/* Private functions--------------------------------------------------------------------------*/
/************************************************
函数名称 ： Analyse_info
功    能 ：解析接收到的数据，并包装转发
参    数 ：p收到的数据   len 收到的数据长度  code 解析的数据对象
返 回 值 ： 无
*************************************************/
void Analyse_info(uint8_t *p,uint32_t len,uint8_t code)
{
//	count = flag_232 + flag_485;
	if ((*(p + 0) == 0x68) &&                          //核对信息帧头尾
		(*(p + len -1) == 0x16))
	{
#if RS232_232_1
		if (code == 1)
		{
			recvinfo_232.Device_ID = (*(p + 1)<<8)|(*(p + 2));
			recvinfo_232.Controller_ID = (*(p + 3)<<8)|(*(p + 4));
			recvinfo_232.Data_len = (*(p + 5)<<8)|(*(p + 6));
			recvinfo_232.p = p + 7;
			count_rx++;
		}
#endif

#if RS485_DB9

		if(code == 2)
		{
			recvinfo_485.Device_ID = (*(p + 1)<<8)|(*(p + 2));
			recvinfo_485.Controller_ID = (*(p + 3)<<8)|(*(p + 4));
			recvinfo_485.Data_len = (*(p + 5)<<8)|(*(p + 6));
			recvinfo_485.p = p + 7;
			count_rx++;
		}
#endif
		if (count == count_rx)                                               //所有协议都接收完了就发
		{
			ask_info();
			count_rx = 0;
		}

	}
}
/************************************************
函数名称 ： tran_modbus
功    能 ：把modbus的数据传过来
参    数 ：无
返 回 值 ： 无
*************************************************/
void tran_modbus(uint16_t *pdata,uint32_t len)
{
#if MODBUS_232_1
	recvinfo_232.Device_ID = 0xA007;
	recvinfo_232.Controller_ID = 0xC007;
	recvinfo_232.Data_len = len;
	recvinfo_232.p = pdata;
	count_rx++;
	if (count == count_rx)                                               //所有协议都接收完了就发
	{
		ask_info();
		count_rx = 0;
	}
#endif

#if MODBUS_485
	recv_modbus485.Device_ID = 0xA007;
	recv_modbus485.Controller_ID = 0xC007;
	recv_modbus485.Data_len = len;
	recv_modbus485.p = pdata;
	count_rx++;
	if (count == count_rx)                                               //所有协议都接收完了就发
	{
		ask_info();
		count_rx = 0;
	}
#endif
}
/************************************************
函数名称 ： tran_modbus
功    能 ：把modbus的数据传过来
参    数 ：无
返 回 值 ： 无
*************************************************/
int tran_mqtt(uint8_t *pdata,uint32_t len)
{
#if MQTT_NB_IOT
	recv_mqtt_nb.p = (uint16_t *)malloc(len * sizeof(uint16_t));
	if (recv_mqtt_nb.p == NULL) {
		printf("Memory allocation failed\n");
		return 1;
	}
	recv_mqtt_nb.Device_ID = 0xA007;
	recv_mqtt_nb.Controller_ID = 0xC007;
	recv_mqtt_nb.Data_len = len;
	for(int i = 0;i < len;i++)
		recv_mqtt_nb.p[i] = (uint16_t)pdata[i];
	count_rx++;
	if (count == count_rx)                                               //所有协议都接收完了就发
	{
		ask_info();
		count_rx = 0;
	}

#endif /*MQTT_NB_IOT*/

#if MQTT_4G_CAT1
	recv_mqtt_4g.p = (uint16_t *)malloc(len * sizeof(uint16_t));
	if (recv_mqtt_4g.p == NULL) {
		printf("Memory allocation failed\n");
		return 1;
	}
	recv_mqtt_4g.Device_ID = 0xA007;
	recv_mqtt_4g.Controller_ID = 0xC007;
	recv_mqtt_4g.Data_len = len;
	for(int i = 0;i < len;i++)
		recv_mqtt_4g.p[i] = (uint16_t)pdata[i];
	count_rx++;
	if (count == count_rx)                                               //所有协议都接收完了就发
	{
		ask_info();
		count_rx = 0;
	}
#endif/*MQTT_4G_CAT1*/
	return 0;
}
/************************************************
函数名称 ： ask_info
功    能 ：应答
参    数 ：无
返 回 值 ： 无
*************************************************/
void ask_info(void)
{
	tx_data.Device_num = count;
	int a = 0;
	#if MODBUS_232_1
		tx_data.Device[a].Device_serial = 1;
		tx_data.Device[a].Data_len = (recvinfo_232.Data_len * 2) + 4;                    //数据长度(每个数据2字节)需要加上设备ID（2） 和控制器ID（2）
		tx_data.Device[a].Device_ID = recvinfo_232.Device_ID;
		tx_data.Device[a].Controller_ID = recvinfo_232.Controller_ID;
		tx_data.Device[a].p = recvinfo_232.p;
		a++;
	#endif

	#if MODBUS_485
		tx_data.Device[a].Device_serial = 1;
		tx_data.Device[a].Data_len = (recv_modbus485.Data_len * 2) + 4;                    //数据长度(每个数据2字节)需要加上设备ID（2） 和控制器ID（2）
		tx_data.Device[a].Device_ID = recv_modbus485.Device_ID;
		tx_data.Device[a].Controller_ID = recv_modbus485.Controller_ID;
		tx_data.Device[a].p = recv_modbus485.p;
		a++;
	#endif

	#if MQTT_NB_IOT
		tx_data.Device[a].Device_serial = 1;
		tx_data.Device[a].Data_len = (recv_mqtt_nb.Data_len * 2) + 4;                    //数据长度(每个数据2字节)需要加上设备ID（2） 和控制器ID（2）
		tx_data.Device[a].Device_ID = recv_mqtt_nb.Device_ID;
		tx_data.Device[a].Controller_ID = recv_mqtt_nb.Controller_ID;
		tx_data.Device[a].p = recv_mqtt_nb.p;
		free(recv_mqtt_nb.p);
		a++;
	#endif /*MQTT_NB_IOT*/

//	#if MQTT_NB_IOT
//		tx_data.Device[a].Device_serial = 1;
//		tx_data.Device[a].Data_len = (recv_mqtt_4g.Data_len * 2) + 4;                    //数据长度(每个数据2字节)需要加上设备ID（2） 和控制器ID（2）
//		tx_data.Device[a].Device_ID = recv_mqtt_4g.Device_ID;
//		tx_data.Device[a].Controller_ID = recv_mqtt_4g.Controller_ID;
//		tx_data.Device[a].p = recv_mqtt_4g.p;
//		free(recv_mqtt_4g.p);
//		a++;
//	#endif /*MQTT_NB_IOT*/

	#if RS232_232_1                                                                      //之前中期检查用的
	//	if(flag_232)
	//	{
			tx_data.Device[0].Device_serial = 1;
			tx_data.Device[0].Data_len = 0x000C;
			tx_data.Device[0].Device_ID = recvinfo_232.Device_ID;
			tx_data.Device[0].Controller_ID = recvinfo_232.Controller_ID;
			tx_data.Device[0].p = recvinfo_232.p;
	//	}

	//	tx_data.Device_num++;
	#endif
	#if RS485_DB9
	//	if(flag_485)
	//	{
			tx_data.Device[1].Device_serial = 2;
			tx_data.Device[1].Data_len = 0x000C;
			tx_data.Device[1].Device_ID = recvinfo_485.Device_ID;
			tx_data.Device[1].Controller_ID = recvinfo_485.Controller_ID;
			tx_data.Device[1].p = recvinfo_485.p;
	//	}

	//	tx_data.Device_num++;
	#endif

	uint8_t askp[1024] = {0};                                         //应答缓存    （包含CRC）
	uint8_t i=0;
//	uint16_t flag = 0;
	askp[i++] = 0x68;

//	if((flag_232 == 1) && (flag_485 == 0))
//		flag = 1;
//	else if((flag_232 == 1) && (flag_485 == 1))
//		flag = 2;
//	askp[i++] = flag >> 8;
//	askp[i++] = flag;

	askp[i++] = tx_data.Device_num ;

	for (int j = 0;j < tx_data.Device_num; j++)
//	for (int j = 0;j < flag; j++)
	{
		askp[i++] = tx_data.Device[j].Device_serial;
		askp[i++] = tx_data.Device[j].Data_len >> 8;
		askp[i++] = tx_data.Device[j].Data_len;
		askp[i++] = tx_data.Device[j].Device_ID >> 8;
		askp[i++] = tx_data.Device[j].Device_ID;
		askp[i++] = tx_data.Device[j].Controller_ID >> 8;
		askp[i++] = tx_data.Device[j].Controller_ID;
	#if RS232_232_1 | RS485_DB9 | MQTT_NB_IOT | MQTT_4G_CAT1
			for (int n= 0; n < 8; n++)
				askp[i++] = tx_data.Device[j].p[n];
	#endif
	#if MODBUS_232_1
			for (int n= 0; n < recvinfo_232.Data_len; n++) {
				askp[i++] = tx_data.Device[j].p[n] >> 8 ;
				askp[i++] = tx_data.Device[j].p[n];
			}
	#endif
	#if MODBUS_485
			for (int n= 0; n < recv_modbus485.Data_len; n++) {
				askp[i++] = tx_data.Device[j].p[n] >> 8 ;
				askp[i++] = tx_data.Device[j].p[n];
			}
	#endif

	}

	askp[i++] = 0x16;                            //结束帧

	Send_Data(&huart3,askp,i);
//	Send_Data(&huart1,askp,i);                   //用485端口测试一下接收信息


}
/************************************************
函数名称 ： protocol_num
功    能 ：协议个数
参    数 ：无
返 回 值 ： 无
*************************************************/
void protocol_num(void)
{
//	count = flag_232 + flag_485;
#if RS232_232_1 | MODBUS_232_1
	count++;
#endif
#if RS485_DB9
	count++;
#endif
#if MODBUS_485
	count++;
#endif
#if MQTT_NB_IOT
	count++;
#endif /*MQTT_NB_IOT*/
#if MQTT_4G_CAT1
	count++;
#endif /*MQTT_G4_CAT1*/

}
